<?php
declare (strict_types = 1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\facade\Db;
use app\service\aiAvatar\VideoAvatarService;
use app\service\TopviewApiService;

class RetryVideoAvatarTasks extends Command
{
    protected function configure()
    {
        $this->setName('retry:video-avatar-tasks')
            ->setDescription('重新处理已完成的视频头像任务（status=2）');
    }

    protected function execute(Input $input, Output $output)
    {
        $output->writeln('开始重新处理已完成的视频头像任务...');

        $apiService = new TopviewApiService();
        $videoAvatarService = new VideoAvatarService($apiService);
        $retryCount = 0;
        $successCount = 0;
        $failCount = 0;

        try {
            // 查询状态为2（已完成）的视频头像任务
            $completedTasks = Db::name('video_avatar_tasks')
                ->where('status', 2)
                ->where(function($query) {
                    $query->where('tts_text', '<>', '')
                          ->where('tts_text', 'not null')
                          ->where('voiceover_id', '<>', '')
                          ->where('voiceover_id', 'not null');
                })
                ->where(function($query) {
                    $query->where('ai_avatar_id', '<>', '')
                          ->where('ai_avatar_id', 'not null')
                          ->whereOr(function($subQuery) {
                              $subQuery->where('video_file_id', '<>', '')
                                       ->where('video_file_id', 'not null');
                          });
                })
                ->select();

            if (empty($completedTasks)) {
                $output->writeln('没有找到需要重新处理的视频头像任务');
                return 0;
            }

            $output->writeln("找到 " . count($completedTasks) . " 个已完成的视频头像任务");

            foreach ($completedTasks as $task) {
                try {
                    $output->writeln("重新处理任务 ID: {$task['id']}, 用户ID: {$task['user_id']}, 原任务ID: {$task['task_id']}");
                    
                    // 准备重新提交的参数
                    $params = [
                        'avatarSourceFrom' => $task['avatar_source_from'],
                        'audioSourceFrom' => $task['audio_source_from'],
                    ];

                    // 根据数字人来源设置参数
                    if ($task['avatar_source_from'] == 0) {
                        if (!empty($task['video_file_id'])) {
                            $params['videoFileId'] = $task['video_file_id'];
                        } else {
                            throw new \Exception('使用上传视频时，video_file_id不能为空');
                        }
                    } else {
                        if (!empty($task['ai_avatar_id'])) {
                            $params['aiAvatarId'] = $task['ai_avatar_id'];
                        } else {
                            throw new \Exception('使用公模数字人时，ai_avatar_id不能为空');
                        }
                    }

                    // 根据音频来源设置参数
                    if ($task['audio_source_from'] == 0) {
                        if (!empty($task['audio_file_id'])) {
                            $params['audioFileId'] = $task['audio_file_id'];
                        } else {
                            throw new \Exception('使用上传音频时，audio_file_id不能为空');
                        }
                    } else {
                        if (!empty($task['tts_text']) && !empty($task['voiceover_id'])) {
                            $params['ttsText'] = $task['tts_text'];
                            $params['voiceoverId'] = $task['voiceover_id'];
                        } else {
                            throw new \Exception('使用TTS时，tts_text和voiceover_id不能为空');
                        }
                    }

                    // 重新提交视频头像任务
                    $result = $videoAvatarService->createVideoAvatarTask($task['user_id'], $params);
                    
                    if (isset($result['taskId'])) {
                        // 更新任务状态为处理中，并更新task_id
                        Db::name('video_avatar_tasks')
                            ->where('id', $task['id'])
                            ->update([
                                'task_id' => $result['taskId'],
                                'status' => 1, // 重新设置为处理中
                                'error_msg' => null, // 清除之前的错误信息
                                'video_url' => null, // 清除之前的视频URL
                                'update_time' => time()
                            ]);
                        
                        $output->writeln("任务 {$task['id']} 重新提交成功，新任务ID: {$result['taskId']}");
                        $successCount++;
                    } else {
                        throw new \Exception('API返回结果中没有taskId');
                    }
                    
                    $retryCount++;
                    
                    // 避免请求过于频繁，添加短暂延迟
                    sleep(2);
                    
                } catch (\Exception $e) {
                    $output->writeln("重新处理任务 {$task['id']} 失败: " . $e->getMessage());
                    
                    // 更新错误信息
                    Db::name('video_avatar_tasks')
                        ->where('id', $task['id'])
                        ->update([
                            'error_msg' => '重新处理失败: ' . $e->getMessage(),
                            'update_time' => time()
                        ]);
                    
                    $failCount++;
                }
            }

            $output->writeln("重新处理完成！");
            $output->writeln("总计处理: {$retryCount} 个任务");
            $output->writeln("成功重新提交: {$successCount} 个任务");
            $output->writeln("重新提交失败: {$failCount} 个任务");
            
        } catch (\Exception $e) {
            $output->writeln('重新处理任务时发生错误: ' . $e->getMessage());
            return 1;
        }

        return 0;
    }
}
